// 给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，
// 使得 a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。

// 注意：答案中不可以包含重复的三元组。
// 双指针
function threeNum(nums) {
  let res = []
  // 对数组进行排序
  nums.sort((a, b) => a - b)
  // 如果数组的长度小于3或者第一个数就大于0 就直接返回
  if (nums.length < 3 || nums[0]>0) {
    return res
  }
  for (var i = 0; i < nums.length; i++) {
    // 对于连续出现的数进行跳过
    if (i > 0 && nums[i] == nums[i - 1]) continue
    // 定义左指针和右指针
    let left = i + 1
    let right = nums.length - 1
    while (left < right) {
      let num = nums[i] + nums[left] + nums[right]
      if (num == 0) {
        res.push([nums[i], nums[left], nums[right]])
        // 对连续出现的数进行跳过，以防止重复
        while(left<right&&nums[left]==nums[left+1]) left++
        while(left<right&&nums[right]==nums[right-1]) right--
        left++
        right--
      }else{
        // 两个指针要分开变化，不能同时变化，不然会错过一些组合
        if(num<0) left++
        if(num>0) right--
      }
    }
  }
  return res
}
console.log(threeNum([1,2,-1,0,1,-2]));
//-2,-1,0,1,1,2